package com.dc.docs._888_面试.concurrent._1_volatile;

import java.util.Objects;

/**
 * Description: 双重检查锁机制
 *  使用volatile 解决因指令重排序导致，创建多个实例的问题
 * @author: gdc
 * @date: 2021/6/15
 * @version 1.0
 */
public class Volatile_6_Signleton {

    /**
     * 如果不用 volatile 修饰，可能会创建出多个实例
     */
    //private static Volatile_SignletonDemo INSTANCE;

    /**
     * 使用 volatile 修饰，解决因指令重排序导致可能创建多个实例的问题
     */
    private static volatile Volatile_6_Signleton INSTANCE;

    private Volatile_6_Signleton() {
        System.out.println("构造方法：" + Thread.currentThread().getName());
    }

    public static Volatile_6_Signleton getInstance() {
        // 第一次检测是否为空
        if (Objects.isNull(INSTANCE)) {
            // 同步锁
            synchronized (Volatile_6_Signleton.class) {
                // 第二次检测是否为空
                if (Objects.isNull(INSTANCE)) {
                    // 多线程出现问题的地方
                    INSTANCE = new Volatile_6_Signleton();
                }
            }
        }
        return INSTANCE;
    }
}
